function require(path) {
    // 有path去判断是否有缓存
    if('判断该模块有缓存吗'){
        return '缓存结果'
    }

    // 运行函数
    function _run(exports,require,module,__filename,__dirname){
        //模块代码
    }

    // 导出的对象
    let module = {
        exports:{}
    }
    
    // 将运行函数的this指向为module.exports
    /*
    这样函数内的 this 就指向了exports空对象；在模块代码文件中 this.a = 'xxx' 就修改了 module对象，最终导出也就是 {a:'xxx'}

    require实现就是函数形式的实现，因此还能访问module对象，他和this是一个内存地址

    参数3的module则是 重指向this的外层变量，

    在commjs到导出方法进而可以使用 module.exports = {a:1,b:1};

    最终导出的也是module.exports 这时候不管this是什么了，他修改了外部module内的exports；函数内this指向的就不是他了
    */
    _run.call(
        module.export,
        module.export,
        require,
        module,
        '文件名',
        '目录名',
    )

    return module.export;
}